home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 081-090 / amok90 / showlink1.2 / showlink.mod < prev    next >
Text File  |  1993-11-04  |  4KB  |  183 lines

  1. (**********************************************************************
  2.  
  3. :Program.    Showlink
  4. :Contents.   Shows AmigaDos file links
  5. :Author.     Christoph Teuber
  6. :Address.    Rheinstr. 65, 5600 Wuppertal 1, West-Germany
  7. :Copyright.  Freeware
  8. :Language.   Oberon
  9. :Translator. AmigaOberon V3.01
  10. :History.    V1.0, 11.11.1991
  11. :History.    V1.1, 18.08.1992 (cht)
  12. :History.    V1.2, 15 Mar 1993 [hG] now checks version correctly (works under 3.0, too)
  13. :Kickstart   2.04 or higher
  14.  
  15. **********************************************************************)
  16.  
  17.  
  18. MODULE ShowLink;
  19.  
  20. IMPORT Exec,
  21.        io,
  22.        SYSTEM,
  23.        Dos,
  24.        u : Utility,
  25.        Strings,
  26.        a : Arguments;
  27.  
  28. TYPE
  29.   Args = STRUCT
  30.     str: Exec.STRPTR;
  31.   END;
  32.  
  33. CONST LinkNameLength = 20;
  34.  
  35. VAR Pfad : Dos.FileLockPtr;
  36.     ok : BOOLEAN;
  37.     vstring : ARRAY 40 OF CHAR;
  38.  
  39. PROCEDURE ParseArgs (VAR Lock : Dos.FileLockPtr) : BOOLEAN;
  40.  
  41. VAR rdargs : Dos.RDArgsPtr;
  42.     oldLock : Dos.FileLockPtr;
  43.     args: Args;
  44.  
  45. BEGIN
  46.  
  47.  args.str := NIL;
  48.  rdargs := Dos.ReadArgs ("Dir", args, NIL);
  49.  IF rdargs = NIL THEN
  50.    RETURN (FALSE)
  51.  ELSE
  52.    IF args.str = NIL THEN
  53.      Lock := Dos.DupLock(a.oldCurrentDir);
  54.    ELSE
  55.      Lock := Dos.Lock (args.str^, Dos.sharedLock);
  56.      IF Lock = NIL THEN
  57.        RETURN (FALSE);
  58.      ELSE
  59.        oldLock := Dos.CurrentDir(Lock);
  60.      END;
  61.    END;
  62.  END;
  63.  RETURN (TRUE);
  64.  
  65. END ParseArgs;
  66.  
  67.  
  68. PROCEDURE ReadListe (MyLock : Dos.FileLockPtr);
  69.  
  70. VAR MyFib : Dos.FileInfoBlockPtr;
  71.     LinkLock : Dos.FileLockPtr;
  72.     NameLink : ARRAY 108 OF CHAR;
  73.     allesInButter, ok, onlyFile : BOOLEAN;
  74.     oldErr : LONGINT;
  75.  
  76. PROCEDURE Ausgabe (Fib : Dos.FileInfoBlockPtr; MyLock : Dos.FileLockPtr);
  77.  
  78. VAR Laenge : LONGINT;
  79.     ok : BOOLEAN;
  80.     RealName : ARRAY 108 OF CHAR;
  81.  
  82.  
  83. PROCEDURE FollowLink (VAR RealName : ARRAY OF CHAR; Name : ARRAY OF CHAR)
  84.                       : BOOLEAN;
  85.  
  86. VAR LinkLock : Dos.FileLockPtr;
  87.     dummyName : ARRAY 108 OF CHAR;
  88.     ok : BOOLEAN;
  89.  
  90.  
  91. BEGIN
  92.  
  93.   LinkLock := Dos.Lock(Name, Dos.sharedLock);
  94.   IF LinkLock = NIL THEN
  95.     RETURN (FALSE);
  96.   END;
  97.  
  98.   ok := Dos.NameFromLock(LinkLock, dummyName, SYSTEM.SIZE(dummyName));
  99.   Dos.UnLock(LinkLock);
  100.   IF ok THEN
  101.     COPY (dummyName, RealName);
  102.     RETURN (TRUE);
  103.   ELSE
  104.     RETURN (FALSE);
  105.   END;
  106.  
  107. END FollowLink;
  108.  
  109.  
  110. BEGIN
  111.  
  112.  io.WriteString (Fib^.fileName);
  113.  Laenge := Strings.Length (Fib.fileName);
  114.  IF Laenge<LinkNameLength THEN
  115.    REPEAT
  116.     io.WriteString (" ");
  117.     INC(Laenge);
  118.    UNTIL Laenge=LinkNameLength;
  119.  END;
  120.  
  121.  ok := FollowLink (RealName, Fib^.fileName);
  122.  IF ok THEN
  123.    CASE Fib.dirEntryType OF
  124.      Dos.linkFile : io.WriteString (" Hardlink TO  "); |
  125.      Dos.linkDir  : io.WriteString ("  Dirlink TO  ");
  126.    END;
  127.    io.WriteString (RealName);
  128.    io.WriteLn;
  129.  END;
  130.  
  131. END Ausgabe;
  132.  
  133.  
  134. BEGIN  (* ReadListe() *)
  135.  
  136.  MyFib := Dos.AllocDosObjectTags (Dos.fib, u.done);
  137.  IF MyFib = NIL THEN
  138.   oldErr := Dos.SetIoErr (Dos.noFreeStore);
  139.   HALT (5);
  140.  END;
  141.  
  142.  allesInButter := Dos.Examine (MyLock, MyFib^);
  143.  
  144.  IF allesInButter THEN
  145.    onlyFile := MyFib^.dirEntryType<0;
  146.    REPEAT
  147.      IF ((MyFib.dirEntryType = Dos.linkFile) OR
  148.          (MyFib.dirEntryType = Dos.linkDir))
  149.      THEN
  150.        Ausgabe (MyFib, MyLock);
  151.      END;
  152.      allesInButter := Dos.ExNext(MyLock, MyFib^);
  153.    UNTIL (NOT allesInButter OR onlyFile);
  154.  IF Dos.IoErr() = Dos.noMoreEntries THEN
  155.    oldErr := Dos.SetIoErr (0);
  156.  ELSE
  157.    HALT (5);
  158.  END;
  159.  END;
  160.  
  161.  IF MyFib#NIL THEN Dos.FreeDosObject (Dos.fib, MyFib) END;
  162.  
  163. END ReadListe;
  164.  
  165.  
  166. BEGIN (* Hauptprogramm *)
  167.  
  168.  vstring := "$VER: Showlink 1.2 (15.3.93)";
  169.  IF Exec.exec.libNode.version >= 37 THEN
  170.    IF ParseArgs(Pfad) THEN
  171.      ReadListe (Pfad);
  172.    END;
  173.  ELSE
  174.    io.WriteString("Requires Kickstart 2.04 or higher\n");
  175.  END;
  176.  
  177. CLOSE
  178.  
  179.  ok := Dos.PrintFault (Dos.IoErr(), "Showlink");
  180.  IF Pfad#NIL THEN Dos.UnLock(Pfad) END;
  181.  
  182. END ShowLink.
  183.